/*
* Conditions Of Use 
* 
* This software was developed by employees of the National Institute of
* Standards and Technology (NIST), an agency of the Federal Government.
* Pursuant to title 15 Untied States Code Section 105, works of NIST
* employees are not subject to copyright protection in the United States
* and are considered to be in the public domain.  As a result, a formal
* license is not needed to use the software.
* 
* This software is provided by NIST as a service and is expressly
* provided "AS IS."  NIST MAKES NO WARRANTY OF ANY KIND, EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT
* AND DATA ACCURACY.  NIST does not warrant or make any representations
* regarding the use of the software or the results thereof, including but
* not limited to the correctness, accuracy, reliability or usefulness of
* the software.
* 
* Permission to use this software is contingent upon your acceptance
* of the terms of this agreement
*  
* .
* 
*/
package gov.nist.core;

import java.text.ParseException;

/** Generic parser class.
* All parsers inherit this class.
*
*@version 1.2
*
*@author M. Ranganathan   <br/>
*
*
*
*/
public abstract class ParserCore {
	public static final boolean debug = Debug.parserDebug;

	static int nesting_level;

	protected LexerCore lexer;

	
	protected NameValue nameValue(char separator) throws ParseException  {
		if (debug) dbg_enter("nameValue");
		try {
               
		lexer.match(LexerCore.ID);
		Token name = lexer.getNextToken();
		// eat white space.
		lexer.SPorHT();
		try {
         
                    
		        boolean quoted = false;

			char la = lexer.lookAhead(0);
                       
			if (la == separator ) {
				lexer.consume(1);
				lexer.SPorHT();
				String str = null;	
				boolean isFlag = false;
				if (lexer.lookAhead(0) == '\"')  {
					 str = lexer.quotedString();
					 quoted = true;
				} else {
				   lexer.match(LexerCore.ID);
				   Token value = lexer.getNextToken();
				   str = value.tokenValue;
				   
				   // JvB: flag parameters must be empty string!
				   if (str==null) {
					   str = "";
					   isFlag = true;
				   }
				}
				NameValue nv = new NameValue(name.tokenValue,str,isFlag);
				if (quoted) nv.setQuotedValue();
				return nv;
			}  else {
				// JvB: flag parameters must be empty string!
				return new NameValue(name.tokenValue,"",true);
			}
		} catch (ParseException ex) {
			return new NameValue(name.tokenValue,null,false);
		}

		} finally {
			if (debug) dbg_leave("nameValue");
		}


	}

	protected  void dbg_enter(String rule) {
		StringBuffer stringBuffer = new StringBuffer();
		for (int i = 0; i < nesting_level ; i++) 
			stringBuffer.append(">");
		    
		if (debug)  {
			System.out.println(
				stringBuffer + rule + 
				"\nlexer buffer = \n" + 
				lexer.getRest());
		}
		nesting_level++;
	}

	protected void dbg_leave(String rule) {
		StringBuffer stringBuffer = new StringBuffer();
		for (int i = 0; i < nesting_level ; i++) 
			stringBuffer.append("<");
		    
		if (debug)  {
			System.out.println(
				stringBuffer +
				rule + 
				"\nlexer buffer = \n" + 
				lexer.getRest());
		}
		nesting_level --;
	}
	
	protected NameValue nameValue() throws ParseException  {
		return nameValue('=');
	}
	
	
	
	protected void peekLine(String rule) {
		if (debug) {
			Debug.println(rule +" " + lexer.peekLine());
		}
	}
}


